package com.yk;

import org.junit.Test;

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamDemo {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("王五");
        list.add("李四");
        list.add("赵六");
        list.add("周七");
        list.add("吴八");
        list.add("郑九");
        list.add("周茜茜");
        list.add("周鑫");

        List<String> list1 = new ArrayList<>();

        list.forEach(s -> {
            if (s.startsWith("周")) {
                list1.add(s);
            }
        });

        List<String> list2 = new ArrayList<>();
        list1.forEach(s -> {
            if (s.length() == 2) {
                list2.add(s);
            }
        });

        list2.forEach(System.out::println);

        System.out.println("---------------------------------------------");

        // 使用 Stream API 筛选出符合条件的元素
        list.stream()
                .filter(s -> s.startsWith("周"))
                .filter(s -> s.length() == 2)
                .forEach(System.out::println); // 过滤出以“周”开头且长度为2的字符串


        // 调用 test1 方法
        StreamDemo demo = new StreamDemo();
        demo.test1();

        // 调用 test2 方法
        demo.test2();
        // 调用 test3 方法
        demo.test3();
    }

    @Test
    public void test1() {
        System.out.println("---------------------------------------------");
        // 创建 Integer 类型的 List
        List<Integer> math = new ArrayList<>();
        math.add(1);
        math.add(2);
        math.add(3);
        math.add(4);
        math.add(5);
        math.add(6);
        math.add(7);
        math.add(8);
        math.add(9);
        math.add(10);
        math.add(11);
        math.add(12);
        math.add(13);
        math.add(14);

        // 使用 Stream API 筛选出偶数
        List<Integer> evenNumbers = math.stream()
                .filter(t -> t % 2 == 0)
                .collect(Collectors.toList());

        // 输出结果
        System.out.println(evenNumbers);
    }

    @Test
    public void test2() {
        System.out.println("---------------------------------------------");
        List<String> list = new ArrayList<>();
        list.add("张三,23");
        list.add("王五,25");
        list.add("赵六,24");

        Map<String, Integer> filteredMap = list.stream().filter(s -> {
            String[] arr = s.split(",");

            int age = Integer.parseInt(arr[1]);

            return age >= 24;
        }).collect(Collectors.toMap(s -> s.split(",")[0], // 键：名字
                s -> Integer.parseInt(s.split(",")[1]))); // 值：年龄

        // 输出结果
        filteredMap.forEach((k, v) -> {
            System.out.println(k + ":" + v);
        });
    }

    @Test
    public void test3() {
        System.out.println("---------------------------------------------");
        List<String> list = new ArrayList<>();
        list.add("赵鑫");
        list.add("周茜茜");
        list.add("周鑫");
        list.add("蔡徐坤");
        list.add("周杰伦");

        List<String> list2 = new ArrayList<>();
        // 女明星
        list2.add("杨幂");
        list2.add("张惠妹");
        list2.add("杨紫");
        list2.add("张韶涵");
        list2.add("张雨鑫");
        list2.add("刘亦菲");

        Stream<String> stream1 = list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length() == 3;
            }
        }).limit(2);

        Stream<String> stream2 = list2.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("杨");
            }
        }).skip(1);
        Stream.concat(stream1, stream2).forEach(System.out::println);
    }
}
